package com.geek.javase.ch18.videodemo.reflect;

import java.io.InputStream;

/*
 *@Date 2025/11/5
 *@Author wangpeng
 *@Description
 *  *  * 反射
 *  * 1.概念：
 *  *   反射是一种机制，利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量，成员方法，构造方法)
 *  * 2.使用方式：
 *  *  使用反射操作类中的成员，大前提：先获得类的Class对象
 *  * 3.使用场景：
 *  *      3.1 开发工具：IDEA、Eclipse等等开发工具
 *  *      3.2 框架：Spring、MyBatis等等框架
 *  * 4.总结
 *  *      4.1 反射是工作在运行时的技术，因为只有运行之后才会有class类对象。
 *  *      4.2 反射的核心思想和关键就是得到，编译以后的class对象。
 *  *      4.3 反射是在运行时获取类的字节码文件对象，然后可以解析类中的全部成分。
 *  *
 *  * Class对象的获取方式  三种方式
 *  * 1.通过类名.class获得
 *  * 2.通过对象名.getClass()方法获得
 *  * 3.Class.forName("类全名")

 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        // 1.通过类名.class获得
        //使用场景：已知类名
        Class<Student> clazz1 = Student.class;
        InputStream is = Student.class.getResourceAsStream("text.txt");
        System.out.println("clazz1="+clazz1);

        //2.通过对象名.getClass()方法获得
        //使用场景：方法形参类型是Object类型
        Student stu = new Student();
        Class<? extends Student> clazz2 = stu.getClass();
        System.out.println("clazz2="+clazz2);
        System.out.println("clazz1==clazz2?"+(clazz1==clazz2));
        testObj(stu);

        //3.Class.forName("包名.类名")  全类名
        //使用场景：使用Spring框架的XML文件中配置实例bean
        Class<?> clazz3 = Class.forName("com.geek.javase.ch18.videodemo.reflect.Student");
        System.out.println("clazz3="+clazz3);
    }

    public static void testObj( Object obj) throws InstantiationException, IllegalAccessException {
        Class<?> clazz = obj.getClass();
        System.out.println(clazz);

        Object o = clazz.newInstance();
        System.out.println(o);
    }
}
